"""
实现一个优先级队列

问题：
    怎样实现一个按优先级排序的队列？ 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素。
解决方案：
    利用 heapq 模块实现了一个简单的优先级队列。
"""

from heapq import heappush, heappop


class PriorityQueue:
    """
    基于heapq实现的优先队列
    """

    def __init__(self):
        self._queue = []
        self._index = 0
        self._size = 0

    @property
    def qsize(self):
        return self._size

    def push(self, item, priority):
        heappush(self._queue, (-priority, self._index, item))
        self._index += 1
        self._size += 1

    def pop(self):
        item = heappop(self._queue)[-1]
        self._size -= 1
        return item


class Item:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Item({!r})".format(self.name)

    def __str__(self):
        return str(self.name)


def use_priority_queue():
    q = PriorityQueue()
    q.push(Item("Kevin"), 1)
    q.push(Item("葛小伦"), 5)
    q.push(Item("天使彦"), 10)
    q.push(Item("天使冷"), 8)

    while q.qsize:
        print(q.pop())
    # 输出结果：
    """
    天使彦
    天使冷
    葛小伦
    Kevin
    """


if __name__ == '__main__':
    use_priority_queue()
